<?php

/**
 +----------------------------------------------+
 * PHP Version 5.2.6                            *
 +----------------------------------------------+
 * 功能说明：
 +----------------------------------------------+
 * @Author    ：九九                            *
 * @QQ        ：405494897                       *
 * @Email     ：xjiujiu@foxmail.com             *
 * @Copyright ：2010/8/16                       *
 * @version   ：                                *
 * @package   ：                                *
 +----------------------------------------------+ 
**/
class LittleTools{
    /**
     * @author  九九
     * @name    私有的构造函数防止被实例化
     * @param 	
     * @return  void
    **/
    private function __construct(){
        //code
    }
    /**
     * @author  九九
     * @name    私有的克隆函数防止被复制
     * @param 	
     * @return  void
    **/
    private function __clone(){
        //code
    }
    
    /**
     * @author  九九
     * @name    显示错误提示
     * @param 	string $errorInfo 提示信息内容
     * @param   int or string $goBackPage 跳转的页面
     * @return  void
    **/
    public static function alertAndExit($errorInfo,$goBackPage = -1,$location = 'window'){
        if(is_numeric($goBackPage)){
            if($goBackPage <> 0){
                if(isset($errorInfo)){
                    echo "<script language='javascript'>alert(\"{$errorInfo}\");history.go({$goBackPage});</script>";
                }else{
                    echo "<script language='javascript'>history.go('{$goBackPage}');</script>";
                }                
                exit;
            }else{
                echo "<script language='javascript'>alert(\"{$errorInfo}\");history.go({$goBackPage});</script>";                
            }
            exit;
        }else{
            if(!empty($goBackPage)){
                if(isset($errorInfo)){
                    echo "<script language='javascript'>alert(\"{$errorInfo}\");{$location}.location = \"{$goBackPage}\";</script>";
                }else{
                    echo "<script language='javascript'>{$location}.location = \"{$goBackPage}\";</script>";
                }               
            }else{
                echo "<script language='javascript'>alert(\"{$errorInfo}\");</script>";
            }
            exit;
        }
    }

    /**
    * @author  九九
    * @name    包入文件
    * @param   string $relativePath 相对路径
    * @param   string $fileType   文件类型
    * @return  void
    **/
    public function includeFile($relativePath,$fileType){
        global $arrSmarty;
        switch($fileType){
            case 'Smarty':
                require_once($relativePath.'config/smarty.inc.php');
                require_once($relativePath.'componets/Smarty/Smarty.class.php');
            break;
            case 'Root':
            break;
            default:
            break;            
        }        
    }
    
    /**
    * @author  九九
    * @name    转化 HTML 代码的特殊字符
    * @param   string $htmlCode
    * @return  void
    **/
    public static function formatHtmlCode($htmlCode){
        if(empty($htmlCode)){
            return null;
        }
        if(is_array($htmlCode)){
            foreach($htmlCode as $key => $value){
                if(preg_match('/context/i',$key)){
                    $htmlCode[$key] = htmlspecialchars($value);
                }
            }
            return $htmlCode;
        }
        return  htmlspecialchars($htmlCode);
    }
    
    /**
    * @author  九九
    * @name    解释 HTML 代码的特殊字符
    * @param 	string $htmlCode
    * @return  void
    **/
    public static function deFormatHtmlCode($htmlCode){
        if(empty($str)){
            return null;
        }
        return htmlspecialchars_decode($htmlCode);
    }
     
    /**
    * @author  九九
    * @name    过滤 SQL 非法字符
    * @param   string or array $str SQL语句
    * @return  string or array
    **/
    public static function filterSql($str){
        return preg_replace('/[\'#`\^\\!\*]*/m',"",$str);
    }
    
    /**
     * @author  九九
     * @name    过滤图片类型 合法类型有：.jpg,.jpeg,.gif,.bmp,.png
     * @param 	string $fileType
     * @return  boolean
    **/
    public static function filterImgType($fileType){
        return preg_match('/(image\/png|image\/jpeg|image\/bmp|image\/gif)/i',$fileType);
    }
    
    /**
     * @author  九九
     * @name    过滤文件类型 合法类型有：.txt,.pdf,.doc,.docx(word2010),.xls,.xlsx(excel2010)
     * @param 	string $fileType
     * @return  boolean
    **/
    public static function filterFileType($fileType){
        return preg_match('/(text\/plain|application\/pdf|application\/msword|application\/vnd\.openxmlformats-officedocument\.wordprocessingml\.document|application\/vnd\.ms-excel|application\/vnd\.openxmlformats-officedocument\.spreadsheetml\.sheet)/i',$fileType);
    }
    
    /**
     * @author  九九
     * @name    生成一个UUID
     * @param 	null
     * @return  void
    **/
    public static function getUUID(){
       return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
           mt_rand(0,0xffff), mt_rand(0, 0xffff),mt_rand(0,0xffff),
           mt_rand(0,0x0fff) | 0x4000,
           mt_rand(0,0x3fff) | 0x8000,
           mt_rand(0,0xffff), mt_rand(0,0xffff),mt_rand(0,0xffff));
    }
    
    /**
    * @author  九九
    * @name    MD5加密
    * @param   string $str 要加密的内容
    * @return  string
    **/
    public static function strMd5($str){
        if(empty($str)){
            return null;
        }
        return md5($str);
    }
    
    /**
    * @author  九九
    * @name    SHA1 加密
    * @param 	 $str 要加密的内容
    * @return  string
    **/
    public static function strSHA1($str){
        if(empty($str)){
            return null;
        }
        return sha1($str);
    }
    
    /**
    * @author  九九
    * @name    base64 转码
    * @param   string array $str 要转码的字符串
    * @return  string
    **/
    public static function strEnBase64($str){
        if(empty($str)){
            return null;
        }
        if(is_array($str)){
            foreach($str as $key => $value){
                $str[$key]  = base64_encode($value);
            }
            return $str;
        }
        return base64_encode($str);
    }
    
    /**
    * @author  九九
    * @name    base64 解码
    * @param   string or array $str 要解码的字符串
    * @return  string
    **/
    public static function strDeBase64($str){
        if(empty($str)){
            return null;
        }
        if(is_array($str)){
            foreach($str as $key => $value){
                $str[$key]  = base64_decode($value);
            }
            return $str;
        }
        return base64_decode($str);
    }
    
    /**
    * @author  九九
    * @name    URL 转码
    * @param   string array $url
    * @return  string
    **/
    public static function urlEncode($url){
        if(empty($url)){
            return null;
        }
        if(is_array($url)){
            foreach($url as $key => $value){
                $url[$key]  = urlencode($value);
            }
            return $url;
        }
        return urlencode($url);
    }
    
    /**
    * @author  九九
    * @name    URL 解码
    * @param   string $url
    * @return  string
    **/
    public static function urlDecode($url){
        if($url){
            return null;
        }
        if(is_array($url)){
            foreach($url as $key => $value){
                $url[$key]  = urldecode($value);
            }
            return $url;
        }
        return urldecode($url);
    }
    
    /**
    * @author  九九
    * @name    二维数据转换为格式化后的二维数组
    * @param   array $arrData 来源二维数组
    * @return  array $arrData['attribute'] 字段名称数组 $arrData['value']具体的值
    **/
    public static function arrayTransform($array = null){
        $arrData = array('key' => array(),'value' => array());
        foreach($array as $key => $value){
            $arrData['key'][]        = $key;
            $arrData['value'][$key]   = $value;
        }
        return $arrData;
    }
    
    /**
     * @author  九九
     * @name    得到表单的属性数组跟对应的值数组
     * @param 	array $arrPOST 需要处理的数组
     * @return  array
    **/
    public static function arrPOSTToArrData($arrPOST = null){
        $arrData    = array();
        if(!isset($arrPOST)){
            return null;
        }
        foreach($arrPOST as $key => $value){            
            $arrData['attributes'][]  = "`$key`";
            $arrData['values'][]      = checkData::checkNull($value);
        }
        return $arrData;
    }
    
    /**
     * @author  九九
     * @name    删除数组中的空值元素
     * @param 	array $arrData 原数组
     * @return  array
    **/
    public static function delArrayNULLElement($arrOrigin){
        if(empty($arrOrigin)){
            return null;
        }
        $arrData = array();
        foreach($arrOrigin as $key => $value){
            if(!is_numeric($value) && empty($value)){
                continue;
            }
            $arrData[$key] = $value;
        }
        return $arrData;
    }
    
    /**
     * @author  九九
     * @name    删除数组中的某个元素通过key来标识，并返回删除后的结果数组
     * @param 	string $cmpKey 用作对比的元素标识
     * @param   array $arrOrigin 要处理的数组
     * @return  array $arrResult 结果数组
    **/
    public static function delArrayElementByKey($cmpKey = null,$arrOrigin){
        
        if(!isset($cmpKey)){
            return $arrOrigin;
        }
        $arrData    = array();
        
        //这里需要注意一下，如果数组即有命名的键标识，
        //也有默认的数字标识，则要除2来处理一下不然会多一个数据。
        foreach($arrOrigin as $key => $value){
            if($key == $cmpKey){
                continue;
            }
            $arrData[$key] = $arrOrigin[$key];
        }
        return $arrData;
    }
    
    /**
     * @author  九九
     * @name    删除数组中的某个元素通过key来标识，并返回删除后的结果数组
     * @param 	string $cmpValue 用作对比的元素值
     * @param   array $arrOrigin 要处理的数组
     * @return  array $arrResult 结果数组
    **/
    public static function delArrayElementByValue($cmpValue = null,$arrOrigin){
        if(!isset($cmpValue)){
            return $arrOrigin;
        }
        $arrData = array();
        foreach($arrResult as $key => $value){
            if($value == $cmpValue){
                continue;
            }
            $arrData[$key] = $value;
        }
        return $arrData;
    }
    
    /**
     * @author  九九
     * @name    得到数据中不为空的元素个数
     * @param 	array $arrData 待测的数组
     * @return  int 
    **/
    public static function getArrayNotEmptyElements($arrData){
        $total  = 0;
        foreach($arrData as $key => $value){
            if($value == ''){
                continue;
            }
            $total ++;
        }
        return $total;
    }
    
    /**
     * @author  九九
     * @name    格式化链接元素
     * @param 	string $value 数组中的值
     * @param   string $type  数组的下标值$key
     * @param   string $nowURL 当前的链接地址
     * @param   string $peopleType 访问者的类型
     * @return  array
    **/
    public static function formatLinkElement($value=null,$type=null,$nowURL=null,$peopleType='admin'){
        if(!preg_match('/(authorName|visitorName)/i',$type) && preg_match('/name/i',$type) == true){
            if(!empty($jumpURL)){
                $value = '<a href=\''.$jumpURL.'\' title=\'详细信息\'>'.$value.'</a>';
            }else{
                $value  = '<a href=\''.$nowURL.'\' title=\'详细信息\'>'.$value.'</a>';
            }
        }
        if(preg_match('/qq/i',$type) == true){
            $value  = preg_replace('/{qq}/',$value,'<a href=\'tencent://message/?Uin={qq}&amp;Menu=yes"{qq}\'>{qq}</a>');
        }elseif(preg_match('/email/i',$type) == true){
            $value  = preg_replace('/{email}/',$value,'<a href=\'mailto:{email}\'>{email}</a>');
        }elseif(preg_match('/url/i',$type) == true){
            if($peopleType != 'admin') return $value;
            $value  = preg_replace('/{url}/',$value,'<a href=\'{url}\' target=\'_blank\'>{url}</a>');
        }elseif(preg_match('/filePath/i',$type) == true){
            $fileName   = base64_decode(substr($value,strrpos($value,'-'),-4));
            if($peopleType != 'admin'){
                return substr($value,3);
            }
            $value      = preg_replace('/{path}/',$value,'<a href=\'{path}\' target=\'_blank\'>'.$fileName.'</a>');
        }elseif(preg_match('/imgPath/i',$type) == true){
            $fileName   = base64_decode(substr($value,strrpos($value,'-'),-4));
            if($peopleType == 'admin'){
                $value      = preg_replace('/{path}/',$value,'<a href=\'{path}\' target=\'_blank\'>'.$fileName.'</a>');
            }else{
                $value      = substr($value,3);
                ////$value      = preg_replace('/{path}/',substr($value,3),'<img class="listImg" src=\'{path}\' alt=\''.$fileName.'\' />');
//                if(!empty($jumpURL)){
//                    $value      = '<a href=\''.$jumpURL.'\' >'.$value.'</a>';
//                }else{
//                    //$value      = '<a href=\''.$nowURL.'\' >'.$value.'</a>';
//                }
            }
        }elseif(preg_match('/context/i',$type) == true){
            if(get_magic_quotes_gpc()){
                    $value     = stripslashes($value);
            }
            $value  = htmlspecialchars_decode($value);
        }
        return $value;
    }
    
    /**
     * @author  九九
     * @name    格式化文件名：去除上传中文名产生乱码以至上传的文件不能用的情况
     * @param 	string $fileName
     * @return  void
    **/
    public static function formatFileName($fileName){
        $fileName   = uniqid(mt_rand(0,10))."-".time().'-'.base64_encode($fileName).substr($fileName,strpos($fileName,'.'));
        return $fileName;
    }
    
    /**
     * @author  九九
     * @name    格式化记录的详细信息
     * @param 	array $arrData   详细记录的信息数组
     * @param   string $category 模块类型
     * @return  array 
    **/
    public static function formatVisitInfoData($arrData,$context){
        $i  = 0;
        $tempArrData    = array();
        foreach($arrData as $key => $value){
            if(is_numeric($key)) continue;
            if($key == $context){
                if(get_magic_quotes_gpc()){
                    $tempArrData[$i]     = stripslashes($arrData[$context]);
                    $tempArrData[$key]   = stripslashes($arrData[$context]);
                }
                $tempArrData[$i]    = htmlspecialchars_decode($tempArrData[$i]);
                $tempArrData[$key]  = htmlspecialchars_decode($tempArrData[$i]);
            }elseif($key == 'imgPath'){
                if(empty($arrData['imgPath'])){
                    $tempArrData[$i]        = "";
                    $tempArrData[$key]      = "";
                    continue;                                                
                                        
                }                    
                $width  = empty($arrData['imgWidth']) ? '': " width='".$arrData['imgWidth']."'";
                $height = empty($arrData['imgHeight']) ? '': " height='".$arrData['imgHeight']."'";
                $imgPath    = substr($arrData['imgPath'],3);
                $tempArrData[$i]        = "<img src='$imgPath' {$width} {$height} alt='{$arrData[1]}' />";
                $tempArrData[$key]      = "<img src='$imgPath' {$width} {$height} alt='{$arrData[1]}' />";
            }elseif($key == 'filePath'){
                if(empty($arrData['filePath'])){
                    $tempArrData[$i]        = "暂无相关文件";
                    $tempArrData[$key]      = "暂无相关文件";
                    continue;
                }
                $fileName   = base64_decode(substr($value,strrpos($value,'-'),-4));
                $filePath   = substr($arrData[$key],3);
                $tempArrData[$i]            = "<a href='$filePath' title='{$arrData[1]}'/>{$fileName}</a>";
                $tempArrData[$key]          = "<a href='$filePath' title='{$arrData[1]}'/>{$fileName}</a>";
            }
            else{
                $tempArrData[$i]        = $arrData[$key];
                $tempArrData[$key]      = $arrData[$key];
            }
            $i ++;
        }
        unset($i);
        unset($j);
        unset($category);
        unset($arrData);
        return $tempArrData;
    }
    
    /**
     * @author  九九
     * @name    删除文件
     * @param 	string or array $filePath
     * @return  int -1 没有权限 1 成功 0 删除 有误
    **/
    public static function killFiles($filePath){
        if(empty($filePath) == true){
            return 0;
        }
        if(is_array($filePath) == true){
            foreach($filePath as $key => $value){
                if(file_exists($value) && is_writeable($value) && is_file($value)){
                    unlink($value);
                }else{
                    return -1;
                }
            }
            return 1;
        }
        if(file_exists($filePath) && is_writeable($filePath) && is_file($filePath)){
            return unlink($filePath);
        }else{
            return -1;
        }
    }
    
    /**
     * @author  九九
     * @name    得到根目录
     * @param 	null
     * @return  string
    **/
    public static function getRootUrl(){
        $nowURL     = "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
        return dirname($nowURL)."/";
    }
    
    /**
     * @author  九九
     * @name    得到非空变量总数 空值包括 false,null,'',"" array()
     * @param 	string and array $str 需要检测的变量
     * @return  boolean
    **/
    public static function getNotEmptyTotal($str){
        if(is_array($str)){
            $i = 0;
            foreach($str as $value){
                if(is_numeric($value)) $i++;
                if(empty($value) == true) continue;
                $i ++;
            }
            return $i;
        }
        if(is_numeric($str)) return 1;
        return empty($str) ? 0 : 1;
    }
    
    /**
     * @author  九九
     * @name    清除所有SESSION
     * @param 	null
     * @return  void
    **/
    public static function destroySession(){
        @session_destroy();
    }
    
    /**
     * @author  九九
     * @name    得到当前日期和时间
     * @param 	string $divide 间隔符 默认为 '-'
     * @return  string
    **/
    public static function getCurrentDateAndTime($divide = '-'){
        return Date("Y{$divide}m{$divide}d H{$divide}m{$divide}s");
    }
    
    /**
     * @author  九九
     * @name    得到当前日期
     * @param 	string $divide 间隔符 默认为 '-'
     * @return  string
    **/
    public static function getCurrentDate($divide = '-'){
        return Date("Y{$divide}m{$divide}d");
    }
    
    /**
     * @author  九九
     * @name    得到当前时间
     * @param 	string $divide 间隔符 默认为 '-'
     * @return  string
    **/
    public static function getCurrentTime($divide = '-'){
        return Date("H{$divide}m{$divide}s");
    }
    
    /**
     * @author  九九
     * @name    秒转化为时期时间
     * @param 	int $second
     * @param   string $divide 间隔符 默认为 '-'
     * @return  string
    **/
    public static function secondToDateTime($second,$divide = '-'){
        if(is_numeric($second)){
            return null;
        }
        return date("Y{$divide}m{$divide}d H{$divide}m{$divide}s",$second);
    }    
    
    /**
     * @author  九九
     * @name    得到用户IP
     * @param 	string $ipType IP的类型
     * @return  array
    **/
    public static function getCurrentIP($ipType){
        $arrIP['remote']  = $_SERVER['REMOTE_ADDR'];
        $arrIP['server']  = $_SERVER['SERVER_ADDR'];
        return $arrIP[$ipType];
    }
    
    /**
     * @author  九九
     * @name    得到服务器操作系统
     * @param 	null
     * @return  array
    **/
    public static function getServerInfo(){
        $arrServerInfo[0]     = $_SERVER['SERVER_ADDR'];
        $arrData  = explode(' ',$_SERVER['SERVER_SOFTWARE']);
        if(preg_match('/win/i',$_SERVER['SystemRoot'])){
            $arrServerInfo[1] = 'Windows平台';
        }else{
            $arrServerInfo[1] = 'UNIX平台';
        }
        foreach($arrData as $key => $value){
            if(preg_match('/php/i',$value)){
                $arrServerInfo[2] = $value;
                break;
            }
        }
        return $arrServerInfo;
    }
    
    /**
     * @author  九九
     * @name    测试网目录的可定权限
     * @param 	string $patch 需要测试的路径
     * @return  void
    **/
    public static function checkWriteFlag($path = ''){
        $path  = empty($path) ? $_SERVER['DOCUMENT_ROOT'] : $path;
        if(is_readable($path)){
            return true;
        }
        return false;
    }
    
    /**
     * @author  九九
     * @name    浏览器类型判断
     * @param 	null
     * @return  string browserName
    **/
    public static function getBrowerName(){
        $arrBrowserMode     = array('IE8' => '/MSIE 8.0/i',
                                    'IE7' => '/MSIE 7.0/i',     
                                    'IE6' => '/MSIE 6.0/i',
                                    'IE5' => '/MSIE 5.5/i',   
                                    'FireFox3' => '/Firefox\/3/i',
                                    'FireFox2' => '/Firefox\/2/i',
                                    'Chrome' => '/Chrome/i',
                                    'Opera' => '/Opera/i',
                                    'Safari' => '/Safari/i'
                                    );
        $typeIdentified     = $_SERVER['HTTP_USER_AGENT'];
        foreach($arrBrowserMode as $key => $value){
            if(preg_match($value,$typeIdentified) == true){
                return $key;
            }
        }
        return 'Unknown';
    }

    /**
     * 过滤请求的数据
     *
     * @param mixed $requestData
     * @access public static
     * @return mixed
     */
    public static function filterRequestData($requestData) {
        if(empty($requestData)) {
            return $requestData;
        }
        if(!magic_quotes_gpc()) {
            $requestData  = addslashes($requestData);
        }

        return htmlspecialchars($requestData);
    }

    /**
     *  得到查询的页码
     *
     *  @param int $page
     *  @access public static
     *  @return int
     */
    public static function getPageNumber($page){
        if(!is_numeric($page)) {
            return 0;
        } else {
            return $page - 1;
        } 
    }

    /**
     * 删除文件支持数组及带有上级目录参数的操作
     *
     * @param string or array $filePath
     * @param string $parentDir, default: .[当前目录下]
     * @return boolean
     */
    public static function deleteFile($filePath , $parentDir = '.') {
        if(is_array($filePath)) {
            foreach($filePath as $file) {
                if(file_exists($parentDir . '/' . $file)) {
                    @unlink($parentDir . '/' . $file);
                }
            }
            return true;
        } else {
            if(file_exists($parentDir . '/' . $filePath)) {
                return @unlink($parentDir . '/' . $filePath);
            }
            return false;
        }
       
    }

    /**
     * 得到当前请求的链接
     *
     * @param void 
     * @return string 
     */
    public static function getNowUrl() {
        if(empty($_SERVER['QUERY_STRING'])) {
            return 'http://'. $_SERVER['HTTP_HOST'] . '/' . $_SERVER['PHP_SELF'] . '?u=1';
        }
        return 'http://'. $_SERVER['HTTP_HOST'] . '/' . $_SERVER['PHP_SELF'] . '?' . $_SERVER['QUERY_STRING'];
    }

    /**
     * 过滤搜索关键字
     *
     * @param string $keywords 关键字
     * @access public static
     * @return string
     */
    public static function filterKeywords($keywords) {
        $keywords   = trim($keywords);
        return strtr($keywords, array('%' => '\%'));
    }

    //过滤多余的反斜杆
    public static function filterMoreSlashes($content) {
        if(get_magic_quotes_gpc()) {
            return stripslashes($content);
        }

        return $content;
    }

    //将HTML转成浏览器可以翻译的文本
    public static function htmlDecode($content) {
        return htmlspecialchars_decode($content);
    }

    //将HTML转成浏览器不能翻译的文本
    public static function htmlEncode($content) {
        return htmlspecialchars($content);
    }

    //页面重定向
    public static function redirect($url, $msg, $waitTime = 3) {
        Header('Location: ' . $url);
        echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
        echo $msg . '正在跳转.....';
    }

}
   
?>
